#ifndef UDP_PUNCHTHROUGH_HPP
#define UDP_PUNCHTHROUGH_HPP

#include <asio.hpp>  // 引入 ASIO 库
#include <iostream>  // 引入输入输出流

using asio::ip::udp;  // 使用 UDP 协议

// UDP 打洞客户端类声明
class UDPPunchthroughClient {
public:
    // 构造函数，传入 I/O 上下文、目标 IP 和端口
    UDPPunchthroughClient(asio::io_context& io_context, const std::string& target_ip, unsigned short target_port);

    // 开始打洞，发送 UDP 数据包
    void start();

private:
    asio::io_context& io_context_;  // ASIO I/O 上下文
    udp::socket socket_;  // UDP 套接字
    udp::endpoint target_endpoint_;  // 目标端点（B 的地址）
    udp::endpoint local_endpoint_;  // 本地端点（A 的地址）

    // 发送打洞请求
    void send_punch();
    
    // 接收回应，确保打洞成功
    void receive_response();
};

#endif // UDP_PUNCHTHROUGH_HPP
